package com.zhanghp.class01;

import java.awt.*;

/**
 * 1! + 2! + 3! + ... + N!
 *
 * @author zhanghp
 * @date 2023/7/27 14:50
 */
public class Code03_SumOfFactorial {
    public static void main(String[] args) {
        int n = 5;
        System.out.printf("%s%n", f1(n));
        System.out.printf("%s%n", f2(n));
    }

    /**
     * 阶乘算法1
     * 每个值都计算一遍阶乘结果，在累加
     *
     * @param n 数值
     * @return 阶乘和结果
     */
    public static long f1(int n) {
        // 边界条件
        long sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += factorial(i);
        }
        return sum;
    }

    /**
     * 阶乘算法2
     * 每个值的阶乘结果 = 上一个阶乘结果 * 目标值， 在累加
     *
     * @param n 数值
     * @return 阶乘和结果
     */
    public static long f2(int n){
        // 总和
        long sum = 0;
        // 阶乘
        long preFactorial = 1;
        for (int i = 1; i <= n; i++) {
            preFactorial *= i;
            sum += preFactorial;
        }
        return sum;
    }

    /**
     * 阶乘
     *
     * @param num 阶乘数值
     * @return 阶乘结果
     */
    public static long factorial(int num){
        // 边界条件
        if(num < 2){
            return num;
        }
        long sum = 1;
        for (int i = 1; i <= num; i++) {
            sum *= i;
        }
        return sum;
    }

}
